/**
 * 获取树形结构数据
 * @param data 数据
 * @param level 父id层级
 * @param idField 字段名
 * @param pidField 上一级字段名
 * @returns {null|[]}
 */
const getTreeData = function (
  data,
  level = null,
  idField = "menu_id",
  pidField = "parent_id"
) {
  const _level = [];
  // 第一次进来获取所有父id
  if (level === null) {
    data.forEach(function (item) {
      _level.push(item[pidField]);
    });
    level = Math.min(..._level);
  }

  // 用来记录已经处理过的节点id，防止循环引用导致死循环
  const processedIds = new Set();

  // 修改递归内部函数
  const getTreeInnerData = (
    data,
    level,
    idField = "menu_id",
    pidField = "parent_id"
  ) => {
    const tree = [];

    data.forEach(function (item) {
      // 如果该节点的父id是当前level，并且还没有处理过该节点
      if (item[pidField] === level && !processedIds.has(item[idField])) {
        // 标记该节点已经处理过，防止重复递归
        processedIds.add(item[idField]);

        // 为每个节点维护单独的路径
        let prefixPath = "";
        if (item.type !== "B") {
          prefixPath += "/" + item.path;
        }

        const childData = getTreeInnerData(
          data,
          item[idField],  // 使用当前节点的id作为下一层级的父id
          idField,
          pidField
        );

        // 处理子节点
        if (childData != null) {
          item["menuPath"] = prefixPath;
          item["children"] = childData;
        } else {
          item["menuPath"] = prefixPath + "/" + item.path;
        }

        tree.push(item);
      }
    });

    return tree.length === 0 ? null : tree;
  };

  return getTreeInnerData(data, level, idField, pidField);
};

/**
 * 获取两个数组差集
 * @param arr1
 * @param arr2
 * @returns {*[]}
 */
const minustArr = function (arr1 = [], arr2 = []) {
  return arr1.filter(function (v) {
    return arr2.indexOf(v) === -1;
  });
};

module.exports = {
  getTreeData,
  minustArr,
};
